#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
工具函数模块
提供通用的工具函数，减少代码重复
"""

import os
import time
from .config import SUPPORTED_VIDEO_EXTENSIONS, LOG_ICONS


class FileUtils:
    """文件操作工具类"""
    
    @staticmethod
    def get_largest_video_file(movie_folder_path):
        """
        获取电影文件夹中尺寸最大的视频文件名（不含扩展名）
        
        Args:
            movie_folder_path (str): 电影文件夹路径
            
        Returns:
            str: 最大的视频文件名（不含扩展名），如果没有找到则返回文件夹名
        """
        try:
            if not os.path.exists(movie_folder_path):
                return os.path.basename(movie_folder_path)
            
            largest_file = None
            largest_size = 0
            
            for file in os.listdir(movie_folder_path):
                file_path = os.path.join(movie_folder_path, file)
                if os.path.isfile(file_path):
                    _, ext = os.path.splitext(file.lower())
                    if ext in SUPPORTED_VIDEO_EXTENSIONS:
                        file_size = os.path.getsize(file_path)
                        if file_size > largest_size:
                            largest_size = file_size
                            largest_file = file
            
            if largest_file:
                # 返回文件名（不含扩展名）
                return os.path.splitext(largest_file)[0]
            else:
                # 如果没有找到视频文件，返回文件夹名
                return os.path.basename(movie_folder_path)
                
        except Exception:
            # 出错时返回文件夹名
            return os.path.basename(movie_folder_path)

    @staticmethod
    def ensure_directory_exists(directory_path):
        """确保目录存在，如果不存在则创建"""
        if not os.path.exists(directory_path):
            os.makedirs(directory_path, exist_ok=True)

    @staticmethod
    def is_video_file(file_path):
        """检查文件是否为支持的视频格式"""
        _, ext = os.path.splitext(file_path.lower())
        return ext in SUPPORTED_VIDEO_EXTENSIONS


class LogUtils:
    """日志工具类"""
    
    @staticmethod
    def format_log(message_type, message):
        """
        格式化日志消息
        
        Args:
            message_type (str): 消息类型 ('info', 'success', 'warning', 'error', etc.)
            message (str): 消息内容
            
        Returns:
            str: 格式化后的消息
        """
        icon = LOG_ICONS.get(message_type, '')
        return f"{icon} {message}" if icon else message

    @staticmethod
    def log_info(message):
        return LogUtils.format_log('info', message)
    
    @staticmethod
    def log_success(message):
        return LogUtils.format_log('success', message)
    
    @staticmethod
    def log_warning(message):
        return LogUtils.format_log('warning', message)
    
    @staticmethod
    def log_error(message):
        return LogUtils.format_log('error', message)
    
    @staticmethod
    def log_processing(message):
        return LogUtils.format_log('processing', message)


class NetworkUtils:
    """网络工具类"""
    
    @staticmethod
    def add_request_delay(delay_seconds=None):
        """添加请求延迟，避免请求过于频繁"""
        from .config import REQUEST_DELAY
        delay = delay_seconds or REQUEST_DELAY
        time.sleep(delay)

    @staticmethod
    def is_valid_url(url):
        """检查URL是否有效"""
        return url and url.startswith(('http://', 'https://'))


class StringUtils:
    """字符串工具类"""
    
    @staticmethod
    def clean_filename(filename):
        """清理文件名，移除不合法字符"""
        import re
        # 移除Windows文件名中不允许的字符
        invalid_chars = r'[<>:"/\\|?*]'
        return re.sub(invalid_chars, '', filename).strip()
    
    @staticmethod
    def extract_year_from_title(title):
        """从标题中提取年份"""
        import re
        year_match = re.search(r'\((\d{4})\)', title)
        return year_match.group(1) if year_match else ''
    
    @staticmethod
    def remove_year_from_title(title):
        """从标题中移除年份"""
        import re
        return re.sub(r'\s*\(\d{4}\)\s*$', '', title).strip()


class ValidationUtils:
    """验证工具类"""
    
    @staticmethod
    def validate_folder_path(folder_path):
        """验证文件夹路径是否有效"""
        if not folder_path or not folder_path.strip():
            return False, "请选择文件夹路径"
        
        if not os.path.exists(folder_path):
            return False, "选择的文件夹不存在"
        
        if not os.path.isdir(folder_path):
            return False, "选择的路径不是文件夹"
        
        return True, ""
    
    @staticmethod
    def validate_movie_name(movie_name):
        """验证电影名称是否有效"""
        if not movie_name or not movie_name.strip():
            return False, "电影名称不能为空"
        
        return True, ""
    
    @staticmethod
    def validate_url(url):
        """验证URL是否有效"""
        if not url or not url.strip():
            return False, "URL不能为空"
        
        if not NetworkUtils.is_valid_url(url):
            return False, "URL格式不正确"
        
        return True, ""
